﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Threading;
using Wrapper;

namespace WPF
{
    public partial class VuePlateau: Window
    {
        // Énumérations utiles
        public enum TypeCase { Artefact, Asteroide, Energie, StationOrbitale, Vide };
        public enum CouleurFlotte { Bleu, Jaune, Rouge, Vert };
        public enum TypeVaisseau { VaisseauMere, Battlecruiser, Capsule };

        // Attributs "principales"
        WrapperJeu monWrapperJeu;

        // Attributs "secondaires"
        char[] tabCouleur = new char [4] { 'B', 'J', 'R', 'V' };
        uint longueurCase = 67;
        uint hauteurCase = 63;
        Line droiteTir;
        Line abscisse;
        int angle;
        List<Point> casesAccessibles;


        /************************* CONSTRUCTEUR *************************/
        public VuePlateau(WrapperJeu wj, int nbJoueurs)
        {
            // Initialisation des composants
            InitializeComponent();

            // Initialisation des attributs 
            this.monWrapperJeu = wj;

            // Initialisation du plateau
            initialiserPlateau(nbJoueurs);  

            // Initialisation des informations (nom des joueurs, couleur des joueurs etc)
            initialiserInfo(nbJoueurs);

            // Initialisations diverses
            creerDroiteTir();                    
        }


        /******************** CRÉATION DU PLATEAU ***********************/
        public void initialiserPlateau(int nbJoueurs)
        {
            // Instanciation de la grille
            monWrapperJeu.instancierGrille();
            
            // Longueur et hauteur plateau
            uint longueurPlateau = monWrapperJeu.getLongueurPlateau();
            uint hauteurPlateau = monWrapperJeu.getHauteurPlateau();

            // Création des colonnes du plateau
            for (uint i = 0; i < longueurPlateau; i++)
            {
                gridPlateau.ColumnDefinitions.Add(new ColumnDefinition());
            }

            // Création des lignes du plateau
            for (uint i = 0; i < hauteurPlateau; i++)
            {
                gridPlateau.RowDefinitions.Add(new RowDefinition());
            }

            // Ajout des images (artefact, énergie et station Orbitale)
            int nbStationOrbitales = 0;
            char cf;
            for (int y = 0; y < hauteurPlateau; y++)
            {
                for (int x = 0; x < longueurPlateau; x++)
                {
                    Image img = new Image();
                    TypeCase typeCase = (TypeCase)monWrapperJeu.getTypeCase(x, y);
                    switch (typeCase)
                    {
                        case TypeCase.Artefact:
                            img.Source = new BitmapImage(new Uri(@"..\Images\Artefact3.png", UriKind.RelativeOrAbsolute));
                            break;
                        case TypeCase.Energie:
                            img.Source = new BitmapImage(new Uri(@"..\Images\Energie.png", UriKind.RelativeOrAbsolute));
                            break;
                        case TypeCase.StationOrbitale:
                            {
                                if (nbJoueurs == 2 && (nbStationOrbitales == 0 || nbStationOrbitales == 1))
                                {
                                    this.monWrapperJeu.setCouleurStationCase(x, y, monWrapperJeu.getCouleurFlotte(0, nbStationOrbitales));
                                    this.monWrapperJeu.setPositionFlotteJoueur(0, nbStationOrbitales, x, y);
                                    cf = tabCouleur[monWrapperJeu.getCouleurFlotte(0, nbStationOrbitales++)];
                                    img.Source = new BitmapImage(new Uri(@"..\Images\VM" + cf + "SASSO" + cf + ".png", UriKind.RelativeOrAbsolute));
                                }
                                else if (nbJoueurs == 2 && (nbStationOrbitales == 2 || nbStationOrbitales == 3))
                                {
                                    int flotte = nbStationOrbitales - nbJoueurs;
                                    this.monWrapperJeu.setCouleurStationCase(x, y, monWrapperJeu.getCouleurFlotte(1, flotte));
                                    this.monWrapperJeu.setPositionFlotteJoueur(1, flotte, x, y);
                                    cf = tabCouleur[monWrapperJeu.getCouleurFlotte(1, flotte)];
                                    img.Source = new BitmapImage(new Uri(@"..\Images\VM" + cf + "SASSO" + cf + ".png", UriKind.RelativeOrAbsolute));
                                    nbStationOrbitales++;
                                }
                                else if (nbJoueurs != nbStationOrbitales)
                                {
                                    this.monWrapperJeu.setCouleurStationCase(x, y, monWrapperJeu.getCouleurFlotte(nbStationOrbitales, 0));
                                    this.monWrapperJeu.setPositionFlotteJoueur(nbStationOrbitales, 0, x, y);
                                    cf = tabCouleur[monWrapperJeu.getCouleurFlotte(nbStationOrbitales++, 0)];
                                    img.Source = new BitmapImage(new Uri(@"..\Images\VM" + cf + "SASSO" + cf + ".png", UriKind.RelativeOrAbsolute));
                                }
                                break;
                            }
                        default:
                            break;
                    }
                    Grid.SetColumn(img, x);
                    Grid.SetRow(img, y);
                    gridPlateau.Children.Add(img);                    
                }
            }

            // Création des astéroides "graphiques"
            List<Polygon> lp = monWrapperJeu.getListePolygoneAsteroide();
            for (int i = 0; i < lp.Count; i++)
            {
                Polygon asteroide = lp[i];
                asteroide.Stroke = System.Windows.Media.Brushes.Purple;
                asteroide.Fill = System.Windows.Media.Brushes.DarkBlue;
                asteroide.StrokeThickness = 2;
                asteroide.Opacity = 0.6;
                gridPlateauEtAsteroides.Children.Add(asteroide);
            }
        }


        /******************** GESTION DU DÉPLACEMENT ********************/
        private void lancerDes(object sender, RoutedEventArgs e)
        {
            //Console.WriteLine("LancerDes()");

            // Lancement des dés
            List<uint>  resultatsLanceDes = this.monWrapperJeu.lancerDesJoueurCourant();
            
            if (resultatsLanceDes.Count == 1) 
            {
                this.de1.Source = new BitmapImage(new Uri(@"..\Images\face" + resultatsLanceDes[0] + ".gif", UriKind.RelativeOrAbsolute));
            }
            else 
            {
                this.de1.Source = new BitmapImage(new Uri(@"..\Images\face" + resultatsLanceDes[0] + ".gif", UriKind.RelativeOrAbsolute));
                this.de2.Source = new BitmapImage(new Uri(@"..\Images\face" + resultatsLanceDes[1] + ".gif", UriKind.RelativeOrAbsolute));
            }

            // Détermination des cases accessibles
            casesAccessibles = new List<Point>();  
            for (int i = 0; i < resultatsLanceDes.Count; i++) {
                casesAccessibles = casesAccessibles.Union(this.monWrapperJeu.getCasesAccessibles(resultatsLanceDes[i])).ToList<Point>();                
            }

            //Console.WriteLine("Nb cases accessibles = " + casesAccessibles.Count);

            // Vérification du déplacement
            if (casesAccessibles.Count == 0)
            {
                popUpDeplacementImpossible();
                bacsulerEnModeTir(this.monWrapperJeu.getNbChargesVaisseauCourant());
            }
            else
            {
                // Désactivation du bouton "lancerDes"
                this.boutonLancerDes.IsEnabled = false;

                // Ajout des images dans les cases accessibles                
                ajouterImagesCasesDeplacements();
            }
        }

        public void ajouterImagesCasesDeplacements()
        {
            // Récupération des propriétés du vaisseau courant
            TypeVaisseau typeVaisseau = (TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant();
            CouleurFlotte couleurVaisseau = (CouleurFlotte)this.monWrapperJeu.getCouleurFlotteCourante();
            bool hasArtefact = this.monWrapperJeu.joueurCourantHasArtefact();

            // Récupération de la longueur du plateau            
            int longueurPlateau = Convert.ToInt32(this.monWrapperJeu.getLongueurPlateau());
            string nomFichierImage = "";

            // 1ère étape : type du vaisseau
            switch (typeVaisseau)
            {
                case TypeVaisseau.VaisseauMere:
                    nomFichierImage = "VM";
                    break;
                case TypeVaisseau.Battlecruiser:
                    nomFichierImage = "BC";
                    break;
                case TypeVaisseau.Capsule:
                    nomFichierImage = "CDS";
                    break;
            }

            // 2e étape : couleur du vaisseau
            switch (couleurVaisseau)
            {
                case CouleurFlotte.Bleu:
                    nomFichierImage += "B";
                    break;
                case CouleurFlotte.Jaune:
                    nomFichierImage += "J";
                    break;
                case CouleurFlotte.Rouge:
                    nomFichierImage += "R";
                    break;
                case CouleurFlotte.Vert:
                    nomFichierImage += "V";
                    break;
            }

            // 3e étape : l'artefact
            if (hasArtefact)
            {
                nomFichierImage += "AA";
            }
            else
            {
                nomFichierImage += "SA";
            }

            // Récupération + modification des images des cases accessibles (source + opacité)
            Image img;
            for (int i = 0; i < casesAccessibles.Count; i++)
            {
                Point p = casesAccessibles[i];

                // 4e étape : type de la case sur laquelle se situe le vaisseau
                TypeCase typeCase = (TypeCase)this.monWrapperJeu.getTypeCase((int)p.X, (int)p.Y);
                switch (typeCase)
                {
                    case TypeCase.Artefact:
                        nomFichierImage += "SA";
                        break;
                    case TypeCase.Energie:
                        nomFichierImage += "SE";
                        break;
                    case TypeCase.StationOrbitale:
                        CouleurFlotte cf = (CouleurFlotte)this.monWrapperJeu.getCouleurStationCase((int)p.X, (int)p.Y);
                        nomFichierImage += "SSO";
                        nomFichierImage += this.tabCouleur[(int)cf];
                        //Console.WriteLine("COULEUR : " + nomFichierImage);
                        break;
                    default:
                        break;
                }

                // Récupération et modifcation de l'image
                img = gridPlateau.Children[(int)p.Y * longueurPlateau + (int)p.X] as Image;
                img.Source = new BitmapImage(new Uri(@"..\Images\" + nomFichierImage + ".png", UriKind.RelativeOrAbsolute));
                img.Opacity = 0.5;

                // Ajout des écouteurs nécessaires au déplacement
                img.MouseEnter += mouseEnterChangeOpacite;
                img.MouseLeave += mouseLeaveChangeOpacite;
                img.MouseDown += choixCaseDeplacement;

                // Suppresion des deux ou trois derniers caractères (SurArtefact (SA), SurEnergie (SE))
                switch (typeCase)
                {
                    case TypeCase.Artefact:
                        nomFichierImage = nomFichierImage.Substring(0, nomFichierImage.Count() - 2);
                        break;
                    case TypeCase.Energie:
                        nomFichierImage = nomFichierImage.Substring(0, nomFichierImage.Count() - 2);
                        break;
                    case TypeCase.StationOrbitale:
                        nomFichierImage = nomFichierImage.Substring(0, nomFichierImage.Count() - 4);
                        break;
                    default:
                        break;
                }
            }
        }

        public void supprimerImagesCasesDeplacements(double x, double y)
        {
            // Récupération de la longueur du plateau            
            int longueurPlateau = Convert.ToInt32(this.monWrapperJeu.getLongueurPlateau());

            Image img;
            Point p;
            TypeCase typeCase;
            for (int i = 0; i < casesAccessibles.Count; i++)
            {
                p = casesAccessibles[i];
                img = gridPlateau.Children[(int)p.Y * longueurPlateau + (int)p.X] as Image;
                if ((p.X != x) || (p.Y != y))
                {
                    typeCase = (TypeCase)this.monWrapperJeu.getTypeCase((int)p.X, (int)p.Y);
                    switch (typeCase)
                    {
                        case TypeCase.Artefact:
                            int nbArtefacts = this.monWrapperJeu.getNbArtefactsCase((int)p.X, (int)p.Y);
                            img.Source = new BitmapImage(new Uri(@"..\Images\Artefact" + nbArtefacts + ".png", UriKind.RelativeOrAbsolute));
                            img.Opacity = 1;
                            break;
                        case TypeCase.Energie:
                            img.Source = new BitmapImage(new Uri(@"..\Images\Energie.png", UriKind.RelativeOrAbsolute));
                            img.Opacity = 1;
                            break;
                        case TypeCase.StationOrbitale:
                            CouleurFlotte cf = (CouleurFlotte)this.monWrapperJeu.getCouleurStationCase((int)p.X, (int)p.Y);
                            char cs = this.tabCouleur[(int)cf];
                            img.Source = new BitmapImage(new Uri(@"..\Images\SO" + cs + ".png", UriKind.RelativeOrAbsolute));
                            img.Opacity = 1;
                            break;
                        default:
                            img.Source = null;
                            break;
                    }
                }

                // Suppression des écouteurs nécessaires au déplacement
                img.MouseEnter -= mouseEnterChangeOpacite;
                img.MouseLeave -= mouseLeaveChangeOpacite;
                img.MouseDown -= choixCaseDeplacement;
            }

            // Suppression de l'image de la case où se situait le vaisseau
            int ancienX = this.monWrapperJeu.getXVaisseauCourant();
            int ancienY = this.monWrapperJeu.getYVaisseauCourant();
            typeCase = (TypeCase)this.monWrapperJeu.getTypeCase(ancienX, ancienY);
            img = gridPlateau.Children[ancienY * longueurPlateau + ancienX] as Image;
            switch (typeCase)
            {
                case TypeCase.Artefact:
                    int nbArtefacts = this.monWrapperJeu.getNbArtefactsCase(ancienX, ancienY);
                    img.Source = new BitmapImage(new Uri(@"..\Images\Artefact" + nbArtefacts + ".png", UriKind.RelativeOrAbsolute));
                    img.Opacity = 1;
                    break;
                case TypeCase.Energie:
                    img.Source = new BitmapImage(new Uri(@"..\Images\Energie.png", UriKind.RelativeOrAbsolute));
                    img.Opacity = 1;
                    break;
                case TypeCase.StationOrbitale:
                    int cf = this.monWrapperJeu.getCouleurStationCase(ancienX, ancienY);
                    img.Source = new BitmapImage(new Uri(@"..\Images\SO" + tabCouleur[cf] + ".png", UriKind.RelativeOrAbsolute));
                    break;
                default:
                    img.Source = null;
                    break;
            }
        }

        public void choixCaseDeplacement(object sender, RoutedEventArgs e)
        {
            //Console.WriteLine("choixCaseDeplacement");
            // Récupération de l'image sur laquelle l'utilisateur a cliquée
            Image img = sender as Image;

            // Récupération de la position de l'image
            int x = Grid.GetColumn(img);
            int y = Grid.GetRow(img);

            // On supprime toutes les autres images des cases accessibles PLUS la case où était le vaisseau
            supprimerImagesCasesDeplacements(Grid.GetColumn(img), Grid.GetRow(img));

            // Modification de l'opacité de l'image afin de bien voir que le vaisseau vient de se déplacer
            img.Opacity = 1;

            // Modification des propriétés du vaisseau (position, HasArtefacts, nbEnergie)
            this.monWrapperJeu.deplacerVaisseauCourant(x, y);

            // Mise à jour de l'image du vaisseau
            miseAJourImageVaisseau(img);

            // Mise à jour des informations visible sur la vue
            miseAJourInfoJoueur(this.monWrapperJeu.getNbJoueurs());

            if (this.monWrapperJeu.joueurCourantAGagne())
            {
                popUpGagner();
            }

            // Basculement en mode tir
            this.bacsulerEnModeTir(this.monWrapperJeu.getNbChargesVaisseauCourant());
        }

        public void miseAJourImageVaisseau(Image img)
        {
            // Récupération des propriétés du vaisseau courant
            TypeVaisseau typeVaisseau = (TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant();
            CouleurFlotte couleurVaisseau = (CouleurFlotte)this.monWrapperJeu.getCouleurFlotteCourante();
            bool hasArtefact = this.monWrapperJeu.joueurCourantHasArtefact();
            TypeCase typeCase = (TypeCase)this.monWrapperJeu.getTypeCaseVaisseauCourant();

            string nomFichierImage = "";

            // 1ère étape : type du vaisseau
            switch (typeVaisseau)
            {
                case TypeVaisseau.VaisseauMere:
                    nomFichierImage = "VM";
                    break;
                case TypeVaisseau.Battlecruiser:
                    nomFichierImage = "BC";
                    break;
                case TypeVaisseau.Capsule:
                    nomFichierImage = "CDS";
                    break;
            }

            // 2e étape : couleur du vaisseau
            switch (couleurVaisseau)
            {
                case CouleurFlotte.Bleu:
                    nomFichierImage += "B";
                    break;
                case CouleurFlotte.Jaune:
                    nomFichierImage += "J";
                    break;
                case CouleurFlotte.Rouge:
                    nomFichierImage += "R";
                    break;
                case CouleurFlotte.Vert:
                    nomFichierImage += "V";
                    break;
            }

            // 3e étape : l'artefact
            if (hasArtefact)
            {
                nomFichierImage += "AA";
            }
            else
            {
                nomFichierImage += "SA";
            }

            // 4e étape : type de la case sur laquelle se situe le vaisseau
            Console.WriteLine("TYPE CASE = " + typeCase);
            switch (typeCase)
            {
                case TypeCase.Artefact:
                    nomFichierImage += "SA";
                    break;
                case TypeCase.Energie:
                    nomFichierImage += "SE";
                    break;
                case TypeCase.StationOrbitale:
                    int x = this.monWrapperJeu.getXVaisseauCourant();
                    int y = this.monWrapperJeu.getYVaisseauCourant();
                    CouleurFlotte cf = (CouleurFlotte)this.monWrapperJeu.getCouleurStationCase(x,y);
                    nomFichierImage += "SSO";
                    nomFichierImage += this.tabCouleur[(int)cf];
                    break;
                default:
                    break;
            }

            // Modification de l'image
            img.Source = new BitmapImage(new Uri(@"..\Images\" + nomFichierImage + ".png", UriKind.RelativeOrAbsolute));
        }

        public void miseAJourInfoJoueur(int nbJoueurs)
        {
            //Console.WriteLine("miseAJourInfoJoueur()");
            uint rangJoueurCourant = this.monWrapperJeu.getRangJoueurCourant();

            if (this.monWrapperJeu.getNbJoueurs() == 2)
            {
                miseAJourInfo2Joueur(rangJoueurCourant);
            }
            else
            {
                switch (rangJoueurCourant)
                {
                    case 1:
                    {
                        // Type vaisseau
                        switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                        {
                            case TypeVaisseau.Battlecruiser:
                                this.typeVaisseauJ1.Text = "BC";
                                break;
                            case TypeVaisseau.Capsule:
                                this.typeVaisseauJ1.Text = "CDS";
                                break;
                            case TypeVaisseau.VaisseauMere:
                                this.typeVaisseauJ1.Text = "VM";
                                break;
                        }

                        // Charges
                        this.chargesJ1.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                        // HasArtefact
                        if (this.monWrapperJeu.joueurCourantHasArtefact())
                        {
                            this.hasArtefactJ1.Text = "oui";
                        }
                        else
                        {
                            this.hasArtefactJ1.Text = "non";
                        }

                        // Total vaisseaux
                        this.totalVaisseauxJ1.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                        // Total artefacts
                        this.totalArtefactsJ1.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                        break;
                    }

                    case 2:
                    {
                        // Type vaisseau
                        switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                        {
                            case TypeVaisseau.Battlecruiser:
                                this.typeVaisseauJ2.Text = "BC";
                                break;
                            case TypeVaisseau.Capsule:
                                this.typeVaisseauJ2.Text = "CDS";
                                break;
                            case TypeVaisseau.VaisseauMere:
                                this.typeVaisseauJ2.Text = "VM";
                                break;
                        }

                        // Charges
                        this.chargesJ2.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                        // HasArtefact
                        if (this.monWrapperJeu.joueurCourantHasArtefact())
                        {
                            this.hasArtefactJ2.Text = "oui";
                        }
                        else
                        {
                            this.hasArtefactJ2.Text = "non";
                        }

                        // Total vaisseaux
                        this.totalVaisseauxJ2.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                        // Total artefacts
                        this.totalArtefactsJ2.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                        break;
                    }

                    case 3:
                    {
                        // Type vaisseau
                        switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                        {
                            case TypeVaisseau.Battlecruiser:
                                this.typeVaisseauJ3.Text = "BC";
                                break;
                            case TypeVaisseau.Capsule:
                                this.typeVaisseauJ3.Text = "CDS";
                                break;
                            case TypeVaisseau.VaisseauMere:
                                this.typeVaisseauJ3.Text = "VM";
                                break;
                        }

                        // Charges
                        this.chargesJ3.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                        // HasArtefact
                        if (this.monWrapperJeu.joueurCourantHasArtefact())
                        {
                            this.hasArtefactJ3.Text = "oui";
                        }
                        else
                        {
                            this.hasArtefactJ3.Text = "non";
                        }

                        // Total vaisseaux
                        this.totalVaisseauxJ3.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                        // Total artefacts
                        this.totalArtefactsJ3.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                        break;
                    }

                    case 4:
                    {
                        // Type vaisseau
                        switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                        {
                            case TypeVaisseau.Battlecruiser:
                                this.typeVaisseauJ4.Text = "BC";
                                break;
                            case TypeVaisseau.Capsule:
                                this.typeVaisseauJ4.Text = "CDS";
                                break;
                            case TypeVaisseau.VaisseauMere:
                                this.typeVaisseauJ4.Text = "VM";
                                break;
                        }

                        // Charges
                        this.chargesJ4.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                        // HasArtefact
                        if (this.monWrapperJeu.joueurCourantHasArtefact())
                        {
                            this.hasArtefactJ4.Text = "oui";
                        }
                        else
                        {
                            this.hasArtefactJ4.Text = "non";
                        }

                        // Total vaisseaux
                        this.totalVaisseauxJ4.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                        // Total artefacts
                        this.totalArtefactsJ4.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                        break;
                    }
                }
            }            
        }

        public void miseAJourInfo2Joueur(uint rangJoueurCourant) {
            int flotte = this.monWrapperJeu.getIndiceFlotteCourante();
            if (rangJoueurCourant == 1)
            {
                if (flotte == 0)
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ1.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ1.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ1.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ1.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ1.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ1.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ1.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                    // Total artefacts
                    this.totalArtefactsJ1.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                }
                else
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ2.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ2.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ2.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ2.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ2.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ2.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ2.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                    // Total artefacts
                    this.totalArtefactsJ2.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                }
            }
            else 
            {
                if (flotte == 0)
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ3.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ3.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ3.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ3.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ3.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ3.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ3.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                    // Total artefacts
                    this.totalArtefactsJ3.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());

                }
                else
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ4.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ4.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ4.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ4.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauCourant());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ4.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ4.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ4.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauxJoueurCourant());

                    // Total artefacts
                    this.totalArtefactsJ4.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsJoueurCourant());
                }
            }
        }

        private void mouseEnterChangeOpacite(object sender, MouseEventArgs e)
        {
            Image img = sender as Image;
            img.Opacity = 1;
        }

        private void mouseLeaveChangeOpacite(object sender, MouseEventArgs e)
        {
            Image img = sender as Image;
            img.Opacity = 0.5;
        }

        public void afficherCanvasDeplacement(TypeVaisseau typeVaisseau)
        {
            // On "cache" les composants du canvasTir
            ((Label)this.dockPanelInfo.FindName("labelAngle")).Visibility = System.Windows.Visibility.Hidden;
            ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Visibility = System.Windows.Visibility.Hidden;
            ((Button)this.dockPanelInfo.FindName("boutonTirer")).Visibility = System.Windows.Visibility.Hidden;
            ((Button)this.dockPanelInfo.FindName("boutonPasserTour")).Visibility = System.Windows.Visibility.Hidden;

            // On affiche les composants du canvasDeplacement
            if (typeVaisseau == TypeVaisseau.VaisseauMere)
            {
                ((Image)this.dockPanelInfo.FindName("de1")).Visibility = System.Windows.Visibility.Visible;
                ((Image)this.dockPanelInfo.FindName("de2")).Visibility = System.Windows.Visibility.Visible;
            }
            else
            {
                ((Image)this.dockPanelInfo.FindName("de1")).Visibility = System.Windows.Visibility.Visible;
                ((Image)this.dockPanelInfo.FindName("de2")).Visibility = System.Windows.Visibility.Hidden;
            }
            ((Button)this.dockPanelInfo.FindName("boutonLancerDes")).Visibility = System.Windows.Visibility.Visible;
            ((Button)this.dockPanelInfo.FindName("boutonLancerDes")).IsEnabled = true;
        }

        public void bacsulerEnModeDeplacement(TypeVaisseau typeVaisseau)
        {
            // On affiche le canvasDeplacement
            afficherCanvasDeplacement(typeVaisseau);
        }

        public void popUpDeplacementImpossible()
        {
            MessageBox.Show("Aucun déplacement n'est possible ! (cliquer sur Ok).", "Déplacement impossible !", MessageBoxButton.OK);
        }

        public void popUpGagner()
        {
            MessageBox.Show("Vous avez gagné !!!", "C'est gagné !", MessageBoxButton.OK);
            this.Close();
        }

        private void passerSonTour(object sender, RoutedEventArgs e)
        {
            // Suppression de la droite tir (même s'il n'y a pas eu de tir)
            supprimerDroiteTir();

            // Remise de l'opacité "normale" du vaisseau
            int longueurPlateau = Convert.ToInt32(this.monWrapperJeu.getLongueurPlateau());
            int x = this.monWrapperJeu.getXVaisseauCourant();
            int y = this.monWrapperJeu.getYVaisseauCourant();
            Image img = gridPlateau.Children[y * longueurPlateau + x] as Image;
            img.Opacity = 1;

            // Modification de l'opacité du stackPanel du joueur courant (NORMAL)
            this.setOpaciteInfoJoueur(0.4);

            // On passe au joueur suivant
            this.monWrapperJeu.joueurSuivant();

            // Modification de l'opacité du stackPanel du joueur courant (FAIBLE)
            this.setOpaciteInfoJoueur(1);

            // Affichage du canvasDeplacement en fonction du type du vaisseau (1 ou 2 dés)        
            TypeVaisseau typeVaisseau = (TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant();
            afficherCanvasDeplacement(typeVaisseau);
        }

        public void finTour()
        {
            // Suppression de la droite tir (même s'il n'y a pas eu de tir)
            supprimerDroiteTir();

            // Remise de l'opacité "normale" du vaisseau
            int longueurPlateau = Convert.ToInt32(this.monWrapperJeu.getLongueurPlateau());
            int x = this.monWrapperJeu.getXVaisseauCourant();
            int y = this.monWrapperJeu.getYVaisseauCourant();
            Image img = gridPlateau.Children[y * longueurPlateau + x] as Image;
            img.Opacity = 1;

            // Modification de l'opacité du stackPanel du joueur courant (NORMAL)
            this.setOpaciteInfoJoueur(0.4);

            // On passe au joueur suivant
            this.monWrapperJeu.joueurSuivant();

            // Modification de l'opacité du stackPanel du joueur courant (FAIBLE)
            this.setOpaciteInfoJoueur(1);

            // Affichage du canvasDeplacement en fonction du type du vaisseau (1 ou 2 dés)        
            TypeVaisseau typeVaisseau = (TypeVaisseau)this.monWrapperJeu.getTypeVaisseauCourant();
            afficherCanvasDeplacement(typeVaisseau);
        }

        public void setOpaciteInfoJoueur(double opacite)
        {
            uint rangJoueurCourant = this.monWrapperJeu.getRangJoueurCourant();
            int flotte = this.monWrapperJeu.getIndiceFlotteCourante();

            if (this.monWrapperJeu.getNbJoueurs() == 2)
            {
                if (rangJoueurCourant == 1)
                {
                    if (flotte == 0)
                    {
                        this.infoJ1.Opacity = opacite;
                    }
                    else
                    {
                        this.infoJ2.Opacity = opacite;
                    }
                }
                else
                {
                    if (flotte == 0)
                    {
                        this.infoJ3.Opacity = opacite;
                    }
                    else
                    {
                        this.infoJ4.Opacity = opacite;
                    }
                }
            }
            else
            {
                switch (rangJoueurCourant)
                {
                    case 1:
                        this.infoJ1.Opacity = opacite;
                        break;
                    case 2:
                        this.infoJ2.Opacity = opacite;
                        break;
                    case 3: 
                        this.infoJ3.Opacity = opacite;
                        break;
                    case 4:
                        this.infoJ4.Opacity = opacite;
                        break;
                }
            }
        }


        /******************** GESTION DU TIR ********************/
        public void creerDroiteTir()
        {
            // Droite abscisse
            abscisse = new Line();
            abscisse.Visibility = System.Windows.Visibility.Hidden;
            abscisse.Stroke = System.Windows.Media.Brushes.Gray;
            abscisse.StrokeThickness = 3;
            abscisse.StrokeEndLineCap = PenLineCap.Triangle;
            gridPlateauEtAsteroides.Children.Add(abscisse);

            // Droite tir
            droiteTir = new Line();
            droiteTir.Visibility = System.Windows.Visibility.Hidden;
            droiteTir.Stroke = System.Windows.Media.Brushes.WhiteSmoke;
            droiteTir.StrokeThickness = 4.5;
            droiteTir.StrokeEndLineCap = PenLineCap.Triangle;
            gridPlateauEtAsteroides.Children.Add(droiteTir);
        }

        public void afficherDroiteTir(int x, int y)
        {
            // Droite abscisse
            abscisse.X1 = longueurCase * (x + 0.5);
            abscisse.Y1 = hauteurCase * (y + 0.5);
            abscisse.X2 = abscisse.X1 + 0.5 * longueurCase;
            abscisse.Y2 = abscisse.Y1;
            abscisse.Visibility = System.Windows.Visibility.Visible;

            // Droite tir
            droiteTir.X1 = longueurCase * (x + 0.5);
            droiteTir.Y1 = hauteurCase * (y + 0.5);
            droiteTir.X2 = droiteTir.X1;
            droiteTir.Y2 = droiteTir.Y1 - 0.5 * hauteurCase;
            droiteTir.Visibility = System.Windows.Visibility.Visible;

            // On affiche l'angle de départ
            ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Text = "90";
            ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Focus();

        }

        public void supprimerDroiteTir()
        {
            abscisse.Visibility = System.Windows.Visibility.Hidden;
            droiteTir.Visibility = System.Windows.Visibility.Hidden;
        }

        private void utilisateurChangeAngle(object sender, KeyEventArgs e)
        {
            // récupération de l'objet TextBox qui contient la valeur de l'angle
            TextBox tb = (TextBox)sender;

            // Si l'utilisateur a fournit une valeur correct et a cliqué sur la touche entrer,
            // alors on modifie la direction du tir
            if (e.Key == Key.Enter && tb.Text != "")
            {
                // On vérifie que l'angle fournit ne comporte que des chiffres
                for (int charpos = 0; charpos < tb.Text.Length; charpos++)
                {
                    if (!Char.IsNumber(tb.Text, charpos))
                    {
                        return;
                    }
                }

                // Modification graphique de l'angle
                modificationDirectionTir(Convert.ToDouble(tb.Text), tb);
            }
            else if (e.Key == Key.Right)
            {
                moinsDixAngle(sender, e);
            }
            else if (e.Key == Key.Left)
            {
                plusDixAngle(sender, e);
            }
            else if (e.Key == Key.Up)
            {
                moinsUnAngle(sender, e);
            }
            else if (e.Key == Key.Down)
            {
                plusUnAngle(sender, e);
            }
        }

        public void modificationDirectionTir(double angleDegres, TextBox tb)
        {
            double angleRadian = angleDegres * (Math.PI / 180);
            double resCos = Math.Cos(angleRadian);
            double resSin = Math.Sin(angleRadian);
            droiteTir.X2 = 0.5 * hauteurCase * resCos + abscisse.X1;
            droiteTir.Y2 = -0.5 * hauteurCase * resSin + abscisse.Y1;

            // Mise à jour du TextBox angle
            tb.Text = angleDegres.ToString();
        }

        private void plusUnAngle(object sender, RoutedEventArgs e)
        {
            // Récupération de l'objet TextBox qui contient la valeur de l'angle
            TextBox tb = ((TextBox)this.dockPanelInfo.FindName("textBoxAngle"));

            // Calcul du nouveau angle en ajoutant 10 degrés
            double nouveauAngle = (Convert.ToDouble(tb.Text) + 1) % 360;

            // Modification graphique de l'angle
            modificationDirectionTir(nouveauAngle, tb);
        }

        private void moinsUnAngle(object sender, RoutedEventArgs e)
        {
            // Récupération de l'objet TextBox qui contient la valeur de l'angle
            TextBox tb = ((TextBox)this.dockPanelInfo.FindName("textBoxAngle"));

            // Calcul du nouveau angle en retirant 10 degrés
            double nouveauAngle = (Convert.ToDouble(tb.Text) - 1) % 360;
            if (nouveauAngle < 0)
            {
                nouveauAngle += 360;
            }

            // Modification graphique de l'angle
            modificationDirectionTir(nouveauAngle, tb);
        }

        private void plusDixAngle(object sender, KeyEventArgs e)
        {
            // Récupération de l'objet TextBox qui contient la valeur de l'angle
            TextBox tb = ((TextBox)this.dockPanelInfo.FindName("textBoxAngle"));

            // Calcul du nouveau angle en ajoutant 10 degrés
            double nouveauAngle = (Convert.ToDouble(tb.Text) + 10) % 360;

            // Modification graphique de l'angle
            modificationDirectionTir(nouveauAngle, tb);
        }

        private void moinsDixAngle(object sender, KeyEventArgs e)
        {
            // Récupération de l'objet TextBox qui contient la valeur de l'angle
            TextBox tb = ((TextBox)this.dockPanelInfo.FindName("textBoxAngle"));

            // Calcul du nouveau angle en retirant 10 degrés
            double nouveauAngle = (Convert.ToDouble(tb.Text) - 10) % 360;
            if (nouveauAngle < 0)
            {
                nouveauAngle += 360;
            }

            // Modification graphique de l'angle
            modificationDirectionTir(nouveauAngle, tb);
        }

        public void afficherCanvasTir(int nbCharges)
        {
            // On "cache" les composants du canvasDeplacement
            ((Image)this.dockPanelInfo.FindName("de1")).Visibility = System.Windows.Visibility.Hidden;
            ((Image)this.dockPanelInfo.FindName("de2")).Visibility = System.Windows.Visibility.Hidden;
            ((Button)this.dockPanelInfo.FindName("boutonLancerDes")).Visibility = System.Windows.Visibility.Hidden;

            // On affiche les composants du canvasTir
            ((Button)this.dockPanelInfo.FindName("boutonPasserTour")).Visibility = System.Windows.Visibility.Visible;
            ((Label)this.dockPanelInfo.FindName("labelAngle")).Visibility = System.Windows.Visibility.Visible;
            ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Visibility = System.Windows.Visibility.Visible;
            ((Button)this.dockPanelInfo.FindName("boutonTirer")).Visibility = System.Windows.Visibility.Visible;

            if (nbCharges > 0)
            {
                ((Button)this.dockPanelInfo.FindName("boutonTirer")).IsEnabled = true;
                ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).IsEnabled = true;
                ((Button)this.dockPanelInfo.FindName("boutonTirer")).Opacity = 1;
                ((Label)this.dockPanelInfo.FindName("labelAngle")).Opacity = 1;
                ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Opacity = 1;

                // Affichage du vecteur tir
                int x = this.monWrapperJeu.getXVaisseauCourant();
                int y = this.monWrapperJeu.getYVaisseauCourant();
                afficherDroiteTir(x, y);

                // Diminution de l'opacite du vaisseau courant
                int longueurPlateau = Convert.ToInt32(this.monWrapperJeu.getLongueurPlateau());
                Image img = gridPlateau.Children[y * longueurPlateau + x] as Image;
                img.Opacity = 0.5;
            }
            else
            {
                ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).IsEnabled = false;
                ((Button)this.dockPanelInfo.FindName("boutonTirer")).IsEnabled = false;
                ((Button)this.dockPanelInfo.FindName("boutonTirer")).Opacity = 0.3;
                ((Label)this.dockPanelInfo.FindName("labelAngle")).Opacity = 0.3;
                ((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Opacity = 0.3;
            }
        }

        public void bacsulerEnModeTir(int nbCharges)
        {
            // On affiche le canvasTir
            afficherCanvasTir(nbCharges);
        }

        private void tirer(object sender, RoutedEventArgs e)
        {
            // Récupération de l'angle
            this.angle = Convert.ToInt32(((TextBox)this.dockPanelInfo.FindName("textBoxAngle")).Text);
            Console.WriteLine("Angle = "+this.angle);

            // Transformation coordonnees
            double x =  this.droiteTir.X1 / this.longueurCase;
            double y = this.droiteTir.Y1 / this.hauteurCase;
            Console.WriteLine("X = " + x);
            Console.WriteLine("Y = " + y);

            // Calcul vecteur
            double angleRadian = this.angle * (Math.PI / 180);
            double resCos = Math.Cos(angleRadian);
            double resSin = Math.Sin(angleRadian+Math.PI);
            Console.WriteLine("resCos = " + resCos);
            Console.WriteLine("resSin = " + resSin);

            // Récupération point arrive
            //Point p = this.monWrapperJeu.getPointArrive(x, y, resCos, resSin);

            // Tirer
            this.monWrapperJeu.setCaseAccessible(this.monWrapperJeu.getXVaisseauCourant(), this.monWrapperJeu.getYVaisseauCourant(), true);
            Point caseTouche = this.monWrapperJeu.tirer(x, y, resCos, resSin);
            this.monWrapperJeu.setCaseAccessible(this.monWrapperJeu.getXVaisseauCourant(), this.monWrapperJeu.getYVaisseauCourant(), false);

            // Affichage droite tir
            Console.WriteLine("Xn = " + caseTouche.X);
            Console.WriteLine("Yn = " + caseTouche.Y);
            this.droiteTir.X2 = caseTouche.X * this.longueurCase;
            this.droiteTir.Y2 = caseTouche.Y * this.hauteurCase;

            int longueurPlateau = Convert.ToInt32(this.monWrapperJeu.getLongueurPlateau()); ;
            Image img;
            if (this.monWrapperJeu.getTouche() == true)
            {
                img = gridPlateau.Children[this.monWrapperJeu.getYVaisseauTouche() * longueurPlateau + this.monWrapperJeu.getXVaisseauTouche()] as Image;
                miseAJourImageVaisseauTouche(img);

                // Mise à jour des infos du joueur touché
                miseAJourInfoJoueurTouche(this.monWrapperJeu.getNbJoueurs());
            }
            // Au cas où le joueur adversaire aurait récupéré un artefact
            miseAJourInfoJoueur(this.monWrapperJeu.getNbJoueurs());
            img = gridPlateau.Children[this.monWrapperJeu.getYVaisseauCourant() * longueurPlateau + this.monWrapperJeu.getXVaisseauCourant()] as Image;
            miseAJourImageVaisseau(img);


            afficherCanvasTir(0);

        }

        public void miseAJourImageVaisseauTouche(Image img)
        {
            // Récupération des propriétés du vaisseau touche
            TypeVaisseau typeVaisseau = (TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche();
            CouleurFlotte couleurVaisseau = (CouleurFlotte)this.monWrapperJeu.getCouleurVaisseauTouche();
            bool hasArtefact = this.monWrapperJeu.vaisseauToucheHasArtefact();
            TypeCase typeCase = (TypeCase)this.monWrapperJeu.getTypeCaseVaisseauTouche();

            Console.WriteLine("Type vaisseau : " + typeVaisseau);
            Console.WriteLine("Couleur vaisseau : " + couleurVaisseau);
            Console.WriteLine("hasArtefact vaisseau : " + hasArtefact);
            Console.WriteLine("Type case : " + typeCase);

            string nomFichierImage = "";

            // 1ère étape : type du vaisseau
            switch (typeVaisseau)
            {
                case TypeVaisseau.VaisseauMere:
                    nomFichierImage = "VM";
                    break;
                case TypeVaisseau.Battlecruiser:
                    nomFichierImage = "BC";
                    break;
                case TypeVaisseau.Capsule:
                    nomFichierImage = "CDS";
                    break;
            }

            // 2e étape : couleur du vaisseau
            switch (couleurVaisseau)
            {
                case CouleurFlotte.Bleu:
                    nomFichierImage += "B";
                    break;
                case CouleurFlotte.Jaune:
                    nomFichierImage += "J";
                    break;
                case CouleurFlotte.Rouge:
                    nomFichierImage += "R";
                    break;
                case CouleurFlotte.Vert:
                    nomFichierImage += "V";
                    break;
            }

            // 3e étape : l'artefact
            if (hasArtefact)
            {
                nomFichierImage += "AA";
            }
            else
            {
                nomFichierImage += "SA";
            }

            // 4e étape : type de la case sur laquelle se situe le vaisseau
            Console.WriteLine("TYPE CASE = " + typeCase);
            switch (typeCase)
            {
                case TypeCase.Artefact:
                    nomFichierImage += "SA";
                    break;
                case TypeCase.Energie:
                    nomFichierImage += "SE";
                    break;
                case TypeCase.StationOrbitale:
                    int x = this.monWrapperJeu.getXVaisseauTouche();
                    int y = this.monWrapperJeu.getYVaisseauTouche();
                    CouleurFlotte cf = (CouleurFlotte)this.monWrapperJeu.getCouleurStationCase(x, y);
                    nomFichierImage += "SSO";
                    nomFichierImage += this.tabCouleur[(int)cf];
                    break;
                default:
                    break;
            }

            // Modification de l'image
            Console.WriteLine("Nom fichier : " + nomFichierImage);
            img.Source = new BitmapImage(new Uri(@"..\Images\" + nomFichierImage + ".png", UriKind.RelativeOrAbsolute));
        }

        public void miseAJourInfoJoueurTouche(int nbJoueurs)
        {
            Console.WriteLine("miseAJourInfoJoueurTouche()");
            Console.WriteLine("Nb joueurs : " + nbJoueurs);
            Console.WriteLine("Type vaisseau : "+this.monWrapperJeu.getTypeVaisseauTouche());
            int rangJoueur = this.monWrapperJeu.getRangJoueurTouche();
            Console.WriteLine("Rang joueur : " + rangJoueur);

            if (this.monWrapperJeu.getNbJoueurs() == 2)
            {
                miseAJourInfo2JoueurTouche((uint)rangJoueur);
            }
            else
            {
                switch (rangJoueur)
                {
                    case 1:
                        {
                            // Type vaisseau
                            switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                            {
                                case TypeVaisseau.Battlecruiser:
                                    this.typeVaisseauJ1.Text = "BC";
                                    break;
                                case TypeVaisseau.Capsule:
                                    this.typeVaisseauJ1.Text = "CDS";
                                    break;
                                case TypeVaisseau.VaisseauMere:
                                    this.typeVaisseauJ1.Text = "VM";
                                    break;
                            }

                            // Charges
                            this.chargesJ1.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                            // HasArtefact
                            if (this.monWrapperJeu.joueurCourantHasArtefact())
                            {
                                this.hasArtefactJ1.Text = "oui";
                            }
                            else
                            {
                                this.hasArtefactJ1.Text = "non";
                            }

                            // Total vaisseaux
                            this.totalVaisseauxJ1.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                            // Total artefacts
                            this.totalArtefactsJ1.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                            break;
                        }

                    case 2:
                        {
                            // Type vaisseau
                            switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                            {
                                case TypeVaisseau.Battlecruiser:
                                    this.typeVaisseauJ2.Text = "BC";
                                    break;
                                case TypeVaisseau.Capsule:
                                    this.typeVaisseauJ2.Text = "CDS";
                                    break;
                                case TypeVaisseau.VaisseauMere:
                                    this.typeVaisseauJ2.Text = "VM";
                                    break;
                            }

                            // Charges
                            this.chargesJ2.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                            // HasArtefact
                            if (this.monWrapperJeu.joueurCourantHasArtefact())
                            {
                                this.hasArtefactJ2.Text = "oui";
                            }
                            else
                            {
                                this.hasArtefactJ2.Text = "non";
                            }

                            // Total vaisseaux
                            this.totalVaisseauxJ2.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                            // Total artefacts
                            this.totalArtefactsJ2.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                            break;
                        }

                    case 3:
                        {
                            // Type vaisseau
                            switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                            {
                                case TypeVaisseau.Battlecruiser:
                                    this.typeVaisseauJ3.Text = "BC";
                                    break;
                                case TypeVaisseau.Capsule:
                                    this.typeVaisseauJ3.Text = "CDS";
                                    break;
                                case TypeVaisseau.VaisseauMere:
                                    this.typeVaisseauJ3.Text = "VM";
                                    break;
                            }

                            // Charges
                            this.chargesJ3.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                            // HasArtefact
                            if (this.monWrapperJeu.joueurCourantHasArtefact())
                            {
                                this.hasArtefactJ3.Text = "oui";
                            }
                            else
                            {
                                this.hasArtefactJ3.Text = "non";
                            }

                            // Total vaisseaux
                            this.totalVaisseauxJ3.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                            // Total artefacts
                            this.totalArtefactsJ3.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                            break;
                        }

                    case 4:
                        {
                            // Type vaisseau
                            switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                            {
                                case TypeVaisseau.Battlecruiser:
                                    this.typeVaisseauJ4.Text = "BC";
                                    break;
                                case TypeVaisseau.Capsule:
                                    this.typeVaisseauJ4.Text = "CDS";
                                    break;
                                case TypeVaisseau.VaisseauMere:
                                    this.typeVaisseauJ4.Text = "VM";
                                    break;
                            }

                            // Charges
                            this.chargesJ4.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                            // HasArtefact
                            if (this.monWrapperJeu.joueurCourantHasArtefact())
                            {
                                this.hasArtefactJ4.Text = "oui";
                            }
                            else
                            {
                                this.hasArtefactJ4.Text = "non";
                            }

                            // Total vaisseaux
                            this.totalVaisseauxJ4.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                            // Total artefacts
                            this.totalArtefactsJ4.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                            break;
                        }
                }
            }
        }

        public void miseAJourInfo2JoueurTouche(uint rangJoueurCourant)
        {
            int flotte = this.monWrapperJeu.getIndiceFlotteTouche();
            if (rangJoueurCourant == 1)
            {
                if (flotte == 0)
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ1.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ1.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ1.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ1.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ1.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ1.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ1.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                    // Total artefacts
                    this.totalArtefactsJ1.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                }
                else
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ2.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ2.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ2.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ2.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ2.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ2.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ2.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                    // Total artefacts
                    this.totalArtefactsJ2.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                }
            }
            else
            {
                if (flotte == 0)
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ3.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ3.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ3.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ3.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ3.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ3.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ3.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                    // Total artefacts
                    this.totalArtefactsJ3.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());

                }
                else
                {
                    // Type vaisseau
                    switch ((TypeVaisseau)this.monWrapperJeu.getTypeVaisseauTouche())
                    {
                        case TypeVaisseau.Battlecruiser:
                            this.typeVaisseauJ4.Text = "BC";
                            break;
                        case TypeVaisseau.Capsule:
                            this.typeVaisseauJ4.Text = "CDS";
                            break;
                        case TypeVaisseau.VaisseauMere:
                            this.typeVaisseauJ4.Text = "VM";
                            break;
                    }

                    // Charges
                    this.chargesJ4.Text = Convert.ToString(this.monWrapperJeu.getNbChargesVaisseauTouche());

                    // HasArtefact
                    if (this.monWrapperJeu.joueurCourantHasArtefact())
                    {
                        this.hasArtefactJ4.Text = "oui";
                    }
                    else
                    {
                        this.hasArtefactJ4.Text = "non";
                    }

                    // Total vaisseaux
                    this.totalVaisseauxJ4.Text = Convert.ToString(this.monWrapperJeu.getNbVaisseauVaisseauTouche());

                    // Total artefacts
                    this.totalArtefactsJ4.Text = Convert.ToString(this.monWrapperJeu.getNbArtefactsVaisseauTouche());
                }
            }
        }


        /******************** DIVERS ********************/
        public void initialiserInfo(int nbJoueurs)
        {
            // Variables nécessaires
            CouleurFlotte cf;
            Brush couleur;

            switch (nbJoueurs)
            {
                case 2:
                    {
                        /***** Modification des informations de J1[1] *****/
                        // Affichage de son nom 
                        this.infoJ1Name.Text = monWrapperJeu.getNomJoueur(0) + "[1]";
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(0, 0);
                        Console.WriteLine(cf);
                        couleur = getBrushCouleur(cf);
                        this.infoJ1.Background = couleur;

                        /***** Modification des informations de J1[2] *****/
                        // Affichage de son nom 
                        this.infoJ2Name.Text = monWrapperJeu.getNomJoueur(0) + "[2]";
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(0, 1);
                        couleur = getBrushCouleur(cf);
                        this.infoJ2.Background = couleur;

                        /***** Modification des informations de J2[1] *****/
                        // Affichage de son nom 
                        this.infoJ3Name.Text = monWrapperJeu.getNomJoueur(1) + "[1]";
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(1, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ3.Background = couleur;

                        /***** Modification des informations de J2[2] *****/
                        // Affichage de son nom 
                        this.infoJ4Name.Text = monWrapperJeu.getNomJoueur(1) + "[2]";
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(1, 1);
                        couleur = getBrushCouleur(cf);
                        this.infoJ4.Background = couleur;
                        break;
                    }
                case 3:
                    {
                        /***** Modification des informations de J1 *****/
                        // Affichage de son nom 
                        this.infoJ1Name.Text = monWrapperJeu.getNomJoueur(0);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(0, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ1.Background = couleur;

                        /***** Modification des informations de J2 *****/
                        // Affichage de son nom 
                        this.infoJ2Name.Text = monWrapperJeu.getNomJoueur(1);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(1, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ2.Background = couleur;

                        /***** Modification des informations de J3 *****/
                        // Affichage de son nom 
                        this.infoJ3Name.Text = monWrapperJeu.getNomJoueur(2);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(2, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ3.Background = couleur;

                        /***** On supprime les informations de J4 *****/
                        this.infoJ4.Visibility = System.Windows.Visibility.Hidden;
                        break;
                    }
                case 4:
                    {
                        /***** Modification des informations de J1 *****/
                        // Affichage de son nom 
                        this.infoJ1Name.Text = monWrapperJeu.getNomJoueur(0);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(0, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ1.Background = couleur;

                        /***** Modification des informations de J2 *****/
                        // Affichage de son nom 
                        this.infoJ2Name.Text = monWrapperJeu.getNomJoueur(1);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(1, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ2.Background = couleur;

                        /***** Modification des informations de J3 *****/
                        // Affichage de son nom 
                        this.infoJ3Name.Text = monWrapperJeu.getNomJoueur(2);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(2, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ3.Background = couleur;

                        /***** Modification des informations de J4 *****/
                        // Affichage de son nom 
                        this.infoJ4Name.Text = monWrapperJeu.getNomJoueur(3);
                        // Modification de la couleur du composant
                        cf = (CouleurFlotte)monWrapperJeu.getCouleurFlotte(3, 0);
                        couleur = getBrushCouleur(cf);
                        this.infoJ4.Background = couleur;
                        break;
                    }
            }
        }

        public Brush getBrushCouleur(CouleurFlotte cf)
        {
            switch (cf)
            {
                case CouleurFlotte.Bleu:
                    return System.Windows.Media.Brushes.Blue;
                case CouleurFlotte.Jaune:
                    return System.Windows.Media.Brushes.Yellow;
                case CouleurFlotte.Rouge:
                    return System.Windows.Media.Brushes.Red;
                default:
                    return System.Windows.Media.Brushes.Green;
            }
        }  
    
    }
}
